/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package runebound.modelo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *
 * Abstracción de mazo de cartas con descarte
 * @author Miguel (alakat@gmail.com)
 */
public class Mazo<E> {
    private List<E> lista;
    private List<E> listaEnUso;
    private List<E> listaDescarte;

    public Mazo(List<E> inicio) {
        this.lista= new ArrayList<>();
        this.listaEnUso= new ArrayList<>();
        this.listaDescarte= new ArrayList<>();
        this.lista.addAll(inicio);
        Collections.shuffle(lista);
    }
    
    /**
     * Coge una carta y la pone en uso
     * @return 
     */
    public E coger(){
        this.checkYReiniciarMazo();
        if(this.lista.isEmpty())
            return null;
        E carta = this.lista.remove(0);
        this.listaEnUso.add(carta);
        return carta;
    }
    
    /**
     * coge una carta, se juega y se descarta
     * @return 
     */
    public E cogerYDescartar(){
        this.checkYReiniciarMazo();
        E carta = this.lista.remove(0);
        this.listaDescarte.add(carta);
        return carta;
    }
    
    /**
     * descarta una carta
     * @param carta 
     */
    public void descartar(E carta){
        this.listaDescarte.add(carta);
        this.listaEnUso.remove(carta);
    }

    /**
     * Comprueba si es necesario volver a mezclar los mazos
     */
    private void checkYReiniciarMazo() {
        if(this.lista.isEmpty()){
            this.lista.addAll(this.listaDescarte);
            this.listaDescarte.clear();
            Collections.shuffle(lista);
        }
        
    }
    
    
    
    
}
